<?php
/*
Описание: Класс для работы с Базой данных. Содержит функции по работе с запросами.
Автор: Andrew Shapovalov
Созданно: 10.01.2009
Обновленно: 06.01.2010
*/

/*Проверяет тип файла
ПАРАМЕТРЫ:
	$type - тип файла для проверки

РЕЗУЛЬТАТ:
	true - если подходит;
	false - если не подходит*/
function shav_check_file_type($type)
{
	if($type == "image/gif" || $type == "image/jpeg" || $type == "image/pjpeg" || $type == "application/x-zip
" || $type == "application/zip" || $type == "application/x-rar" || $type == "image/png" || $type == "image/tif" || $type == "image/jpg")
		return true;
	else
		return false;
}

/*Изменяет размер картинки
Параметры:
	$in_file — путь к jpg-изображению, которое надо изменить
	$out_file — место и имя новой картинки
	$percent — процент, который будет составлять новая каринка от исходной

Результат:
	Измененный файл

КАК ИСПОЛЬЗОВАТЬ:
	shav_jpgresize($file_from, $file_to, 25);*/
function shav_jpgresize($in_file, $out_file, $percent)
{
	$old_img = imagecreatefromjpeg($in_file);
	$old_img_size = getimagesize($in_file);

	$new_size_w = $old_img_size[0]*$percent/100;
	$new_size_h = $old_img_size[1]*$percent/100;
	$img_new = imagecreatetruecolor($new_size_w, $new_size_h);

	imagecopyresampled($img_new, $old_img, 0, 0, 0, 0, $new_size_w, $new_size_h, $old_img_size[0], $old_img_size[1]);
	imageinterlace($img_new, 1);
	imagejpeg($img_new, $out_file, 100);

//	copy($in_file, $out_file);
	//echo 'old_img='.$in_file.' img_new='.$out_file.'<br />';

	imagedestroy($img_new); # убить объект, но не файл
	imagedestroy($old_img);
}


/*Изменяет размер картинки и преобразует формат
Параметры:
     $in_file  путь к jpg-изображению, которое надо изменить
     $out_file  место и имя новой картинки
     $new_size_w - ширина новой картинки в пикселях
     $new_size_h  высота новой картинки в пикселях

Результат:
     Измененный файл

КАК ИСПОЛЬЗОВАТЬ:
     shav_imageresize($file_from, $file_to, 640, 480);

АВТОР:
	Шаповалов Антон*/
function shav_imageresize($in_file, $out_file, $new_size_w, $new_size_h)
{
     $ext = strtolower(substr($in_file,-3));
     if($ext == 'jpg')     $old_img = imagecreatefromjpeg($in_file);
     if($ext == 'png')     $old_img = imagecreatefrompng($in_file);
     if($ext == 'gif')     $old_img = imagecreatefromgif($in_file);

     $old_img_size = getimagesize($in_file);

     $img_new = imagecreatetruecolor($new_size_w, $new_size_h);

     imagecopyresampled($img_new, $old_img, 0, 0, 0, 0, $new_size_w, $new_size_h, $old_img_size[0], $old_img_size[1]);
     //imageinterlace($img_new, 1);

     $ext = strtolower(substr($out_file,-3));
     if($ext == 'jpg')     imagejpeg($img_new, $out_file, 100);
     if($ext == 'png')     imagepng($img_new, $out_file);
     if($ext == 'gif')     imagegif($img_new, $out_file);
}

/*Функция для изменения размера изображения и наложения водяного знака на него.
ПАРАМЕТРЫ:
	$outfile -  путь к файлу, который получится после преобразования;
	$infile - путь к файлу, который преобразуем;
	$watermark - путь к файлу с фодянным знаком;
	$neww - ширина в px, к которой преобразуем;
	$quality - качество изображения в %.
РЕЗУЛЬТАТ:
	Создает картинку заданного размера и с водянным знаком.*/
function shav_ImageResizeWithWatermark($outfile, $infile, $watermark, $neww = 0, $quality = 100)
{
	if(!file_exists($infile))
	{
		$tags = array('$FILE$'=>$infile);
		echo shav_createContentsByTags($tags, ERROR_FILES_0003);
		return;
	}

	if(!file_exists($watermark))
	{
		$tags = array('$FILE$'=>$watermark);
		echo shav_createContentsByTags($tags, ERROR_FILES_0003);
		return;
	}

	if($neww == 0)
	{
		//Получаем исходный файл
		$ext = strtolower(substr($infile, -3));
		if($ext == 'jpg')	$im = imagecreatefromjpeg($infile);
		if($ext == 'png')	$im = imagecreatefrompng($infile);
		if($ext == 'gif')	$im = imagecreatefromgif($infile);

		//Добовляем фодянной знак
		$ext = strtolower(substr($watermark, -3));
		if($ext == 'jpg')	$im_logo = imagecreatefromjpeg($watermark);
		if($ext == 'png')	$im_logo = imagecreatefrompng($watermark);
		if($ext == 'gif')	$im_logo = imagecreatefromgif($watermark);

		imagecopy($im, $im_logo, 0, 0, 0, 0, imagesx($im_logo), imagesy($im_logo));

		//Сохраняем новое изображение.
		imagejpeg($im, $outfile, $quality);

		//Очищаем все временное
		imagedestroy($im);
		imagedestroy($im_logo);
	}
	else
	{
		$im = imagecreatefromjpeg($infile);
		$newh = $neww * imagesy($im) / imagesx($im);

		$im1 = imagecreatetruecolor($neww, $newh);
		imagecopyresampled($im1, $im, 0, 0, 0, 0, $neww, $newh, imagesx($im), imagesy($im));

		if($neww >= 140)//добавляем водяной знак на изображения больше среднего размера
		{              //путь к изображению с водяным знаком
			$ext = strtolower(substr($watermark, -3));
			if($ext == 'jpg')	$im_logo = imagecreatefromjpeg($watermark);
			if($ext == 'png')	$im_logo = imagecreatefrompng($watermark);
			if($ext == 'gif')	$im_logo = imagecreatefromgif($watermark);

			imagecopy($im1, $watermark, 0, 0, 0, 0, 150, 25);
		}
		imagejpeg($im1,$outfile,$quality);
		imagedestroy($im);
		imagedestroy($im1);
	}
}

/*Закачивает файл в папку на сервере
ПАРАМЕТРЫ:
	$to - папка на сервере, куда копируем файл;
	$field - поле формы с файлом.

РЕЗУЛЬТАТ:
	ошибка если файл не возможно загрузить или путь к загруженному файлу*/
function shav_upload_files($to, $file_name, $field = 'file')
{
	if(empty($_FILES))
		return '<pre>'.ERROR_FILES_0001.'</pre>';

	if(!is_dir($to))
	{
		mkdir($to);
	}

	if(is_writable($to))
	{
		/*$file = $_FILES[$field]["name"];

		$file = str_replace(' ', '_', $file);
		$file = str_replace('(', '', $file);
		$file = str_replace(')', '', $file);
		$file = str_replace('[', '', $file);
		$file = str_replace(']', '', $file);
		$file = str_replace('{', '', $file);
		$file = str_replace('}', '', $file);
		$file = str_replace('@', '', $file);
		$file = str_replace('#', '', $file);
		$file = str_replace('$', '', $file);
		$file = str_replace('^', '', $file);
		$file = str_replace('&', '', $file);
		$file = str_replace('*', '', $file);
		$file = str_replace('=', '', $file);
		$file = str_replace('+', '', $file);*/

		if (!file_exists($to.$file_name))
		{
			move_uploaded_file($_FILES[$field]["tmp_name"], $to.$file_name);
			return $to.$file_name;
		}
	}
	else
	{
		return '<pre>'.ERROR_FILES_0002.'</pre>';
	}
}

/*Очищает папки, удаляя все файлы и сами папки
ПАРАМЕТРЫ:
	$directory - папка на сервере, для удаления;

РЕЗУЛЬТАТ:
	ошибка если файл не возможно загрузить.*/
function shav_delete_folders($current_dir)
{
	if($dir = @opendir($current_dir))
	{
		while (($f = readdir($dir)) !== false)
		{
			if($f > '0' and filetype($current_dir.$f) == "file")
			{
				unlink($current_dir.$f);
			}
			elseif($f > '0' and filetype($current_dir.$f) == "dir")
			{
				shav_delete_folders($current_dir.$f."\\");
			}
		}
		closedir($dir);
		rmdir($current_dir);
	}
}

/*Получаем массим ввиде название параметра и его значения
ПАРАМЕТРЫ:
	$string - строка со сначением и названием параметра;
	$symbol - символ-разделитель
РЕЗУЛЬТАТ:
	Массив типа array(NAME, VALUE)*/
function shav_options_value_pars($string = '', $symbol = ' ')
{
	if($string == '')
		return '';

	$opt_array = split($symbol, strip_tags($string));

	return array('NAME' => $opt_array[0], 'VALUE' => $opt_array[1]);
}

/*Получаем все опции по ключу
ПАРАМЕТРЫ:
	$text - содержимое опций;
	$symbol - символ разделителя параметров.
РЕЗУЛЬТАТ:
	Массив с полученными опциями.*/
function shav_options_pars($text, $symbol = ',')
{
	global $shavDB;

	if($text == '')
		return array();

	$opt = split($symbol, strip_tags($text));
	$count = count($opt);
	$i = 0;
	while($i < $count)
	{
		$options[] = shav_options_value_pars($opt[$i]);
		$i++;
	}

	return $options;
}

/*Выводит содержимое массива
ПАРАМЕТРЫ:
	$array - Массив для вывода*/
function DrawObject($array = array())
{
	if(empty($array))
	{
		echo '<br />'.MSG_ARRAYS_0002;
		return;
	}

	echo '<pre>';
	print_r($array);
	echo '</pre>';
}

/*Отправляет сообщение на электронную почту
ПАРАМЕТРЫ:
	$from - от кого пришло письмо;
	$to - эллектронный адрес получателя (e-mail);
	$message - собственно само сообщение в HTML;
	$title - тема сообщения.

РЕЗУЛЬТАТ:
	Сообщение об отправке почты или ошибке.*/
function shav_send_mail($from, $to, $message = "", $title = "No title")
{
	if($to == '')
		return ERROR_MAILS_0001;

	$headers  = 'MIME-Version: 1.0' . "\r\n";
	$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
	$headers .= 'From: '.$from."\r\n". 'Reply-To: '.$to;

	mail($from, $title, $message, $headers);

	return MSG_MAILS_0001;
}

/*Получаем часть текста
ПАРАМЕТРЫ:
	$text - исходный текст;
	$size - длина выходного текста (в словах)
РЕЗУЛЬТАТ:
	Текст из $size-слов*/
function shav_get_half_text($text, $size = 10)
{
	if($text == '')
		return '';

	$postx = split(" ", strip_tags($text));

	$i = 1;
	$cont = '';
	$count = count($postx);
	foreach ($postx as $word)
	{
		$cont .= $word.' ';
		$i++;

		if($i > $size)
			break;
	}

	if($count > $size)
		return $cont."[...]";
	else
		return $cont;
}

/*Генерирует пароль определенной длины
ПАРАМЕТРЫ:
	$size - длина пароля.
РЕЗУЛЬТАТ:
	Произвольный пароль из $size символов.*/
function shav_genSecretKey($size = 15)
{
	$arr = array(	'a','b','c','d','e','f',
			'g','h','i','j','k','l',
			'm','n','o','p','r','s',
			't','u','v','x','y','z',

			'A','B','C','D','E','F',
			'G','H','I','J','K','L',
			'M','N','O','P','R','S',
			'T','U','V','X','Y','Z',

			'1','2','3','4','5','6',
			'7','8','9','0','.',',',
			'(',')','[',']','!','?',
			'&','^','%','@','*','$',
			'<','>','/','|','+','-',
			'{','}','`','~');

	// Generating new password
	$pass = "";
	$i = 0;
	$index = 0;
	while($i < $size)
	{
		// Getting random index
		$index = rand(0, count($arr) - 1);
		$pass .= $arr[$index];

		$i++;
	}

	return $pass;
}

/*Создает разбивку на страницы
ПАРАМЕТРЫ:
	$count - Количество данных для разбивки на страницы;
	$max_rows = 10 - количество строк на одной странице.
РЕЗУЛЬТАТ:
	Выводит строку ввиде 1, 2, 3,..., n, где 1-n - это номера страниц.*/
function shav_createPageForDataArray($count, $max_rows = 10, $cur_page = 1)
{
	$text = '';
	$pages = (int)($count / $max_rows);

	if((int)($pages * $max_rows) < $count)
		$pages = $pages + 1;

	$i = 1;
	while($i <= $pages)
	{
		if(($cur_page) == $i)
			$page_str .= $i.', ';
		else
			$page_str .= '<a href="?page='.$i.'">'.$i.'</a>, ';
		$i++;
	}

	$page_str = substr($page_str, 0, strlen($page_str)-2);
	$text = '<p class="page">'.PAGE.$page_str.'</p>';

	return $text;
}

/*Создает ссылку которая обрабатывается используя скрипт на PHP. В этом скрипте можно выполнять SQL-запросы и при этом текущая страничка не перегружается.
ПАРАМЕТРЫ:
	$to_script - скрипт для обработки параметров при нажатии на ссылку;
	$text_for_link - текст для ссылки (можно и тег <img>);
	$params - массив параметров, имеет вид: array('<параметр>'=>'<значение>', ...);
	$isDraw - выводить или аернуть HTML-код.
РЕЗУЛЬТАТ:
	Выводит на экран или возвращает HTML-код ссылки с использованием JavaScript.*/
function shav_createJSLink($to_script, $text_for_link, $params = array('id'=>'0'), $aler = 'JavaScript is Done!', $isDraw = false)
{
	if(empty($params))
	{
		if($isDraw == true)
			echo MSG_ARRAYS_0001;
		else
			return MSG_ARRAYS_0001;
	}

	$params_query = '';
	foreach($params as $key=>$value)
	{
		$params_query .= $key.'='.$value.'&';
	}

	$params_query = str_replace('&', '&amp;', substr($params_query, 0, strlen($params_query)-1));

	$content = '<a href="#" onclick="$.post(\''.$to_script.'?'.$params_query.'\', function(data){alert(\''.$aler.'\');});">'.$text_for_link.'</a>';

	if($isDraw == true)
		echo $content;
	else
		return $content;
}
?>